/*
 * main.c
 *
 *  Created on: 05/06/2011
 *      Author: joao e sheila
 */


#include "lista.h"
#include "arvore.h"
#include "leitura.h"



typedef struct{
    int comp;
    char* elementos[100]; //ate 100 livros
} Lista_de_arquivos;


/* Funcao que trata a consulta do usuario, selecionando as palavras na Arvore e fazendo as
operações necessárias em listas. Em seguida, imprime as linhas que satisfazem os criterios da consulta */
void TratarConsulta(char consulta[300], no *P, Lista_de_arquivos arquivos){
        int i, j, cont=0;
        char *palavra;
        char sinal;
        LISTA C, Auxiliar;
        FILE *fp;
        char linha[MAX_LINHA];
        int linha_atual;
        int consultado;

        /*Para cada livro*/
        while (cont<arquivos.comp){
        	Cria(&C);
        	Cria(&Auxiliar);
        	i=0;
        	consultado=0;
        	linha_atual=1;




			/*FAZ CODIGO*/
			/* Separa as palavras */
			while(consulta[i] != '\0'){
				if (ehLetra(consulta[i])){
					sinal = consulta[i-1];
					palavra =(char *) malloc(100*sizeof(char));
					strcpy(palavra, retornaPalavra(consulta, &i)); //i continua contando dentro da funcao, parará no prox + ou -
					if (busca(palavra, P) == NULL){
						printf("Palavra \"%s\" nao encontrada.\n", palavra);
					} else { /*existe a palavra*/
						if(sinal == '+'){
							if (consultado == 0){ /*1a consulta*/
								for(j=0; j<(busca(palavra, P)->listaarq.comp_arquivo); j++){
									if(strcmp(busca(palavra, P)->listaarq.elementos[j].nome_arquivo, arquivos.elementos[cont])==0) //ve se tem essa palavra nesse livro
										CopiaLista(&busca(palavra, P)->listaarq.elementos[j].linha_do_arquivo, &C);
								}
							}
							else{ // outras consultas com +
								for(j=0; j<(busca(palavra, P)->listaarq.comp_arquivo); j++){
									if(strcmp(busca(palavra, P)->listaarq.elementos[j].nome_arquivo, arquivos.elementos[cont])==0) //ve se tem essa palavra nesse livro
										Interseccao(&busca(palavra, P)->listaarq.elementos[j].linha_do_arquivo, &Auxiliar, &C);
								}
							}

							consultado++;
						} else if (sinal == '-'){ //entradas com -
							for(j=0; j<(busca(palavra, P)->listaarq.comp_arquivo); j++){
								if(strcmp(busca(palavra, P)->listaarq.elementos[j].nome_arquivo, arquivos.elementos[cont])==0) //ve se tem essa palavra nesse livro
								Diferenca(&Auxiliar, (&busca(palavra, P)->listaarq.elementos[j].linha_do_arquivo), &C);
							}
						}
						CopiaLista(&C, &Auxiliar);
					}
				} else {
					i++;
				}
			}
			printf("%s \n", arquivos.elementos[cont]);
			printf("linhas a imprimir:");
			ImprimeLista(&C);

			if( (fp = fopen(arquivos.elementos[cont], "rb")) == NULL){
				printf("Erro ao abrir o arquivo.\n");
			} else {
				/* Varre as linhas, verificando e imprimindo se necessario. */
				while(fgets(linha, MAX_LINHA, fp) != NULL){
					if(Localiza(linha_atual, &C) != FIM)
						printf("linha %d: %s", linha_atual, linha);
					linha_atual++;
				}
			}



		printf("\n");
        cont++;
        }
}

/* Recebe a consulta do usuario e chama as funcoes necessarias */
int main() {
	no *P = NULL;
	char consulta[300];
	int i = 1;
	Lista_de_arquivos arquivos;

	arquivos.comp=0;

	printf("-Insira um livro - formato: &arquivo.txt \n"
		"-Forneca uma consulta - formato: +aaa-bbb \n"
		"-Entre \"#\" para sair \n");

	scanf("%s", &consulta);

	while (strcmp("#", consulta) != 0) {
		if (consulta[0] == '&') { //para entrar arquivos
			arquivos.elementos[arquivos.comp]=retornaLivro(consulta, i); //salva nome do livro no vetor
			P= lerArquivo(arquivos.elementos[arquivos.comp], P); //monta arvore do livro
			arquivos.comp++;

			geraIndice(P);
			i = 1;




		} else {
			if (arquivos.comp == 0) {
				printf("Entre um livro antes!");
			}
			else
				TratarConsulta(consulta, P, arquivos);
		}

		printf("\n\n "
			"-Insira um livro - formato: &arquivo.txt \n"
			"-Forneca uma consulta - formato: +aaa-bbb \n"
			"-Entre \"#\" para sair \n");
		scanf("%s", &consulta);
	}

	return 0;
}
